export default {
  // 为当前模块开启命名空间
  namespaced: true,
  // 模块的 state 数据，用于存放购物车各种商品的信息
  state: () => ({
    // 购物车的数组，存放每个商品的信息对象
    // 每个商品信息都包含6个属性
    // {goods_id,goods_name,goods_price,goods_count,goods_small_logo,goods_state}
    // 读取本地存储的购物车数据
    cart: JSON.parse(uni.getStorageSync('cart') || '[]')
  }),
  // 模块的  mutations 方法
  mutations: {
    // 购物车添加商品
    addToCart(state , goods){
      // 查找当前商品有没有在当前数组中，没有，返回undefined；有，返回当前商品信息；
      const findResult = state.cart.find((item) => item.goods_id === goods.goods_id)
      // 没有当前商品，添加到 cart 数组中
      if(!findResult){
        state.cart.push(goods)
      }else{
        // 有当前商品，数量+1
        findResult.goods_count++
      }
      // 通过 commit 方法，调用 m_cart 命名空间下的 saveToStorage 方法
      this.commit('m_cart/saveToStorage')
    },
    // 将购物车信息保存到本地
    saveToStorage(state){
      uni.setStorageSync('cart' , JSON.stringify(state.cart))
    },
    // 修改最新的选中状态
    updateGoodsState(state , goods){
      // 根据 goods_id 查询购物车中对应商品的信息对象
      const findResult = state.cart.find(item => item.goods_id === goods.goods_id)
      // 判断是否有对应的信息对象
      if(findResult){
        // 修改最新的选中状态
        findResult.goods_state = goods.goods_state
        // 保存到本地
        this.commit('m_cart/saveToStorage')
      }
    },
    // 修改商品数量
    updateGoodsCount(state , goods){
      // 根据 goods_id 查询购物车中对应商品的信息对象
      const findResult = state.cart.find(item => item.goods_id === goods.goods_id)
      // 判断是否有对应的信息对象
      if(findResult){
        // 修改最新的商品数量
        findResult.goods_count = goods.goods_count
        // 保存到本地
        this.commit('m_cart/saveToStorage')
      }
    },
    // 删除商品
    removeGoodsById(state , goods_id){
      // 返回一个新数组，当然不包括对应的商品
      state.cart = state.cart.filter(item => item.goods_id !== goods_id)
      // 保存到本地
      this.commit('m_cart/saveToStorage')
    },
    // 全选与反选
    updateAllGoodsState(state , newchecked){
      // 修改所有商品的选中状态
      state.cart.forEach(item => item.goods_state = newchecked)
      // 保存到本地缓存中
      this.commit('m_cart/saveToStorage')
    }
  },
  // 模块的  getters 属性
  getters: {
    total(state){
      // 存放商品总数量
      let sum = 0
      // 循环计算商品数量
      state.cart.forEach((item) => sum += item.goods_count)
      return sum
    },
    // 勾选商品的数量
    checkedCount(state){
       // 先使用 filter 方法，从购物车中过滤器已勾选的商品
       // 再使用 reduce 方法，将已勾选的商品总数量进行累加
       // reduce() 的返回值就是已勾选的商品的总数量
       // 筛选已经勾选了的商品,在进行商品数量的累加
      return state.cart.filter(item => item.goods_state).reduce((total , item) => total += item.goods_count , 0)
    },
    // 勾选商品的总价
    checkedGoodsAmount(state){
      // 先使用 filter 方法，从购物车中过滤器已勾选的商品
      // 再使用 reduce 方法，将已勾选的商品数量 * 单价之后，进行累加
      // reduce() 的返回值就是已勾选的商品的总价
      // 最后调用 toFixed(2) 方法，保留两位小数
      return state.cart.filter(item => item.goods_state)
      .reduce((price , item) => price += item.goods_count * item.goods_price , 0).toFixed(2)
    }
  }
}